package com.cskaoyan.javase.oop1._11static._0introduction._1new;

/**
 * 总之,这个"学校信息"的属性,就不应该是成员变量.而应该考虑定义一种"全新的，属于类的"变量
 * 实际上在Java当中,用static关键字修饰的成员变量,称之为静态成员变量,静态成员变量,不属于对象,而属于类,
 *      属于该类全体对象所共享的一个属性.
 *
 * static可以修饰成员变量,表示静态成员变量
 * 语法:
 * [访问权限修饰符] static 数据类型 变量名;
 * 注: 访问权限修饰符这里直接省略不写.
 *
 * 静态成员变量和成员变量一样,都具有默认值.而且默认初始化具有默认值的过程,是所有给它赋值操作的第一步.静态成员变量也是永远先具有默认值.
 * 注: 默认值和成员变量的默认值是一模一样的
 * 静态成员变量也可以显式赋值,并且显式赋值会覆盖掉默认值.
 *
 * 静态成员变量的特点:
 *      1.静态成员变量属于全体对象共享一个变量,整个类全局独一份.
 *      2.静态成员变量属于类,和对象完全没有对象,用对象名点访问静态成员变量(好像静态成员变量是属于对象的一样),这种做法是错误的.
 *      应该使用"类名点"访问静态成员变量
 *      特殊情况下, 当静态成员变量处在同类中时,在其它位置,可以直接写方法名调用.
 *      3.静态成员变量和对象没有关系,它的初始化,赋值过程也和创建对象的过程没有任何关系.
 *      即便不创建对象,也可以使用类名点访问静态成员变量.
 *
 * ------------------------------------------------------
 *
 * static也可以修饰成员方法,称之为静态成员方法
 * 语法:
 * [访问权限修饰符] static 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 实际上以往我们使用"public static"方法都是静态成员方法.
 *
 * 静态成员方法的特点:
 *      1.和静态成员变量一样,静态成员方法也是属于类的
 *          静态成员方法的调用应该用:"类名点"调用
 *          不需要创建任何对象
 *          特殊情况下, 当静态成员方法处在同类中时,在其它位置,可以直接写方法名调用.
 *
 *      2.静态成员也是不需要依赖于创建对象的,无需对象,直接调用.
 *
 *
 * static修饰的静态成员(变量和方法),为什么具有以上特点呢?
 *
 *
 *
 *
 * @since 09:27
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    static int num;
    public static void main(String[] args) {
        // WangDaoStudent s1 = new WangDaoStudent("张三", "男", 18, 1);
        // WangDaoStudent s2 = new WangDaoStudent("李四", "女", 28, 3);
        // // Static member 'com.cskaoyan.javase.oop1._11static._0introduction._1new.WangDaoStudent.schoolInfo' accessed via instance reference
        // 静态成员通过对象的引用去访问,这种做法是不对的
        // 以下访问方式是错误的
        /*System.out.println(s1.schoolInfo);
        s1.schoolInfo = "Java42th";
        System.out.println(s2.schoolInfo);*/

        // 正确的访问姿势
        System.out.println(WangDaoStudent.schoolInfo);
        WangDaoStudent.schoolInfo = "王道训练营";
        System.out.println(WangDaoStudent.schoolInfo);

        WangDaoStudent.test();

        method();
    }

    public static void method(){

    }

    /*
        成员方法test2是需要创建对象才能够去使用的
        这个方法中可以直接访问同类的静态成员
        这说明静态成员不依赖于创建对象,并且在创建对象之前就应该能够访问和使用了.

        实际上,静态成员的初始化都依赖于类加载的过程,
        类加载先于创建对象
        所以在成员方法中,可以随便访问静态成员
     */
    public void test2(){
        method();
        System.out.println(num);
    }
}

class WangDaoStudent {
    // 属性
    String name;
    // 性别
    /*
        性别建议使用String类型的变量去表示
        尤其不建议使用布尔类型的isMale或者isFemale
     */
    String gender;
    int age;
    int id;
    static String schoolInfo = "Java40th";

    // 行为
    public void eat() {
        System.out.println("吃饭！");
    }

    public void study() {
        System.out.println("学习！");
    }

    public WangDaoStudent() {
    }

    public WangDaoStudent(String name, String gender, int age, int id) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.id = id;
    }

    // 静态成员方法
    public static void test(){
        System.out.println("hello world!");
    }
}